最近在研究TTS的過程中發現了SAM TTS這個古老的TTS,所以我試著復刻一個相似的服務。
以下是我簡單的紀錄
雖然現在 TTS 技術已經非常先進(像是 Google TTS 或 Microsoft Azure TTS),但 SAM TTS 有一種「電子懷舊感」,再加上它的聲音控制參數(pitch、speed、mouth、throat)讓人可以隨意玩出各種「搞怪語音」。
模組 | 技術 |
---|---|
語音核心 | sam-js |
前端框架 | React / Next.js(你也可以用純 HTML) |
音訊播放 | HTML5 <audio> + Blob 物件 |
UI 組件 | Tailwind CSS or DaisyUI(快速做出調整面板) |
進階分享(選用) | Supabase 儲存分享紀錄 & URL |
sam-js
在你的專案中先安裝這個語音合成核心:
npm install sam-js
如果沒有使用打包工具,也可以直接 引入原始 JS。
import sam from 'sam-js';
function synthesize(text, options = { pitch: 64, speed: 72, mouth: 128, throat: 128 }) {
const buffer = sam(text, options);
const blob = new Blob([buffer], { type: 'audio/wav' });
const url = URL.createObjectURL(blob);
return url;
}
你可以把這個 url 給 audio 元件播放,或用 a.download 提供下載。
簡單的 HTML UI 範例如下:
<textarea id="inputText"></textarea>
<button onclick="play()">播放</button>
<audio id="audio" controls></audio>
搭配剛才的 synthesize() 函式,就可以做出以下功能:
function play() {
const text = document.getElementById('inputText').value;
const url = synthesize(text);
const audio = document.getElementById('audio');
audio.src = url;
audio.play();
}
SAM 的樂趣之一就是可以控制聲音風格。建議用 4 個 range input 讓使用者調整參數:
透過這些參數,可以變出:
🧪 示範網站
🧵 結語
透過這篇文章,我們成功復刻了 SAM TTS 的聲音生成邏輯,並用 JavaScript 做出一個可即時播放和分享語音的網頁工具。如果你喜歡這種開源懷舊風,不妨也來玩玩看!